/**
 * Copyright (c) subnew
 * Licensed under the GPL;
 * @email:joseanluo@gmail.com
 * @Title: AbstractEntity.java
 * @Package com.subnew.copyman.frame.dao.entity
 */
package com.subnew.mango.frame.dao.entity;

import java.io.Serializable;

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;

/**
 * 抽象实体基类.<br>
 * 依赖包org.apache.commons.lang3
 * @author JoseanLuo
 * @date 2014年8月28日 下午8:51:30
 * @version V1.0
 */
public abstract class AbstractEntity<ID extends Serializable> {
	/**
	 * 
	 * 取得主键ID
	 * 
	 * @return
	 * @Title: getId
	 * @author JoseanLuo
	 * @date 2014年8月28日 下午8:57:05
	 * @version V1.0
	 */
	public abstract ID getId();

	/**
	 * 
	 * 设置主键ID
	 * 
	 * @param id
	 * @Title: setId
	 * @author JoseanLuo
	 * @date 2014年8月28日 下午8:57:16
	 * @version V1.0
	 */
	public abstract void setId(ID id);

	/**
	 * 重写equals方法,实体比较变为Ｃｌａｓｓ类型相同ＩＤ相同就认为相等。
	 */
	@Override
	public boolean equals(Object object){
		//object为空
		if(null==object){
			return false;
		}
		//相同指向。
		if(this==object){
			return true;
		}
		//相同类型才能断续往下执行
		if(!getClass().equals(object.getClass())){
			return false;
		}
		AbstractEntity<?> that=(AbstractEntity<?>) object;
		return null==this.getId()?false:this.getId().equals(that.getId());
	}
	/**
	 * 重写ｈａｓｈＣｏｄｅ方法，使相同类型对象,ＩＤ相同时，ｈａｓｈＣｏｄｅ相同。
	 */
	@Override
	public int hashCode(){
	int hashCode=52;
	hashCode+=null==getId()?0:getId().hashCode()*6;
	return hashCode;
	}
	/**
	 * 重写toString方法，方便打印出实体属性。依赖包org.apache.commons.lang3
	 */
	@Override
	public String toString(){
		return ReflectionToStringBuilder.toString(this);
	}
}
